#include QMK_KEYBOARD_H

enum layers {
    _BASE,
    _LOWER,
    _RAISE,
    _NUM,
    _FN
};

enum keycodes {
    QWERTY = SAFE_RANGE,
    DYNAMIC_MACRO_RANGE,
};

#include "dynamic_macro.h"

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

    /* Base layer (0)
     * ,-----------------------------------------------------------------------------------.
     * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
     * |------+------+------+------+------+-------------+------+------+------+------+------|
     * |Esc/Fn|   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  | Del  |
     * |------+------+------+------+------+------|------+------+------+------+------+------|
     * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |  Up  |Enter |
     * |------+------+------+------+------+------+------+------+------+------+------+------|
     * | Ctrl |  GUI |  Alt |  \|  |Lower |Sp/Num|Space |Raise |AltGr | Left | Down |Right |
     * `-----------------------------------------------------------------------------------'
     */
    [_BASE] = LAYOUT_ortho_4x12(
        KC_TAB,           KC_Q,    KC_W,    KC_E,    KC_R,       KC_T,             KC_Y,   KC_U,       KC_I,    KC_O,    KC_P,    KC_BSPC,
        LT(_FN, KC_ESC),  KC_A,    KC_S,    KC_D,    KC_F,       KC_G,             KC_H,   KC_J,       KC_K,    KC_L,    KC_SCLN, KC_DEL,
        KC_LSFT,          KC_Z,    KC_X,    KC_C,    KC_V,       KC_B,             KC_N,   KC_M,       KC_COMM, KC_DOT,  KC_UP,   KC_ENT,
        KC_LCTL,          KC_LGUI, KC_LALT, KC_NUBS, MO(_LOWER), LT(_NUM, KC_SPC), KC_SPC, MO(_RAISE), KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT
    ),

    /* Lower layer (1)
     * Function keys, navigation
     * ,-----------------------------------------------------------------------------------.
     * |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  | F10  | F11  | F12  |
     * |------+------+------+------+------+-------------+------+------+------+------+------|
     * |      |      |      |      |      |      |      |      |      |      |      | Ins  |
     * |------+------+------+------+------+------|------+------+------+------+------+------|
     * |      |CapsLk|      |PrtSc |ScrLk |Pause |      |      |      |      | PgUp |      |
     * |------+------+------+------+------+------+------+------+------+------+------+------|
     * |      |      |      |      |      |      |      |      | Menu | Home | PgDn | End  |
     * `-----------------------------------------------------------------------------------'
     */
    [_LOWER] = LAYOUT_ortho_4x12(
        KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS,
        _______, KC_CAPS, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______, _______, _______, KC_PGUP, _______,
        _______, _______, _______, _______, _______, _______, _______, _______, KC_APP,  KC_HOME, KC_PGDN, KC_END
    ),
    
     /* Raise layer (2)
     * National characters, special characters
     * ,-----------------------------------------------------------------------------------.
     * |  +1  |  ě2  |  š3  |  č4  |  ř5  |  ž6  |  ý7  |  á8  |  í9  |  é0  |  ´   |  ˇ   |
     * |------+------+------+------+------+-------------+------+------+------+------+------|
     * |  ;°  |      |      |      |      |      |  (   |  )   |  §   |  !   |  ú   |  /   |
     * |------+------+------+------+------+------|------+------+------+------+------+------|
     * |      |      |      |      |      |      |  %   |  =   |  ¨   |  '   |  -   |  _   |
     * |------+------+------+------+------+------+------+------+------+------+------+------|
     * |      |      |      |      |      |      |      |      |      |      |      |      |
     * `-----------------------------------------------------------------------------------'
     */
    [_RAISE] = LAYOUT_ortho_4x12(
        KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,          KC_8,    KC_9,    KC_0,          KC_EQL,  LSFT(KC_EQL),
        KC_GRV,  _______, _______, _______, _______, _______, LSFT(KC_RBRC), KC_RBRC, KC_QUOT, LSFT(KC_QUOT), KC_LBRC, LSFT(KC_LBRC),
        _______, _______, _______, _______, _______, _______, LSFT(KC_MINS), KC_MINS, KC_BSLS, LSFT(KC_BSLS), KC_SLSH, LSFT(KC_SLSH),
        _______, _______, _______, _______, _______, _______, _______,       _______, _______, _______,       _______, _______
    ),
    
    /* Numbers layer - numpad (3)
     * ,-----------------------------------------------------------------------------------.
     * |      |  1   |  2   |  3   |  4   |  5   |  6   |  7   |  8   |  9   |  0   |      |
     * |------+------+------+------+------+-------------+------+------+------+------+------|
     * |      |      |      |      |      |      |      |  4   |  5   |  6   |  /   |      |
     * |------+------+------+------+------+------|------+------+------+------+------+------|
     * |      |NumLk |      |      |      |      |      |  1   |  2   |  3   |  *   |      |
     * |------+------+------+------+------+------+------+------+------+------+------+------|
     * |      |      |      |      |      |      |      |  .   |  0   |  +   |  -   |      |
     * `-----------------------------------------------------------------------------------'
     */
    [_NUM] = LAYOUT_ortho_4x12(
        _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_0, _______,
        _______, _______, _______, _______, _______, _______, _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_PSLS, _______,
        _______, KC_NLCK, _______, _______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_PAST, _______,
        _______, _______, _______, _______, _______, _______, _______, KC_DOT,  KC_KP_0, KC_PPLS, KC_PMNS, _______
    ),
    
    /* Function layer (4)
     * Backlighting, keyboard controls, etc.
     * m_ - music, r_ - RGB + backlight, f_ - macro
     * ,-----------------------------------------------------------------------------------.
     * |      | r_BL |      |Sleep |      |      |      |f_Rec1|f_Pla1|f_Stop|      |m_Vol+|
     * |------+------+------+------+------+-------------+------+------+------+------+------|
     * |      |r_VLK |r_Mod+|r_Hue+|r_Sat+|r_Bri+|      |f_Rec2|f_Pla2|      |      |m_Vol-|
     * |------+------+------+------+------+------|------+------+------+------+------+------|
     * |      |r_TOG |r_Mod-|r_Hue-|r_Sat-|r_Bri-|      |      |      |      |m_Stop|m_Mute|
     * |------+------+------+------+------+------+------+------+------+------+------+------|
     * | Reset|      |      |      |      |C+A+D |C+A+I |      |      |m_Prev|m_Paus|m_Next|
     * `-----------------------------------------------------------------------------------'
     */
    [_FN] = LAYOUT_ortho_4x12(
        _______, BL_STEP, _______,  KC_SLEP, _______, _______,     _______,     DYN_REC_START1, DYN_MACRO_PLAY1, DYN_REC_STOP, _______, KC_VOLU,
        _______, VLK_TOG, RGB_MOD,  RGB_HUI, RGB_SAI, RGB_VAI,     _______,     DYN_REC_START2, DYN_MACRO_PLAY2, _______,      _______, KC_VOLD,
        _______, RGB_TOG, RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD,     _______,     _______,        _______,         _______,      KC_MSTP, KC_MUTE,
        RESET,   _______, _______,  _______, _______, LCA(KC_DEL), LCA(KC_INS), _______,        _______,         KC_MPRV,      KC_MPLY, KC_MNXT
    )
};


void matrix_init_user(void) {
    
}

void matrix_scan_user(void) {
    
}

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    if (!process_record_dynamic_macro(keycode, record)) {
        return false;
    }
    return true;
}

void led_set_user(uint8_t usb_led) {
    
}
